// 函数柯里化
//?什么是柯里化
/**
 * 1.一个函数可以接收多个参数
 * 2.不固定参数个数的函数
 * 3.第一次执行返回函数
 * 4.后续执行也返回函数
 * 5.能缓存参数
 * 6.闭包防止污染
 */

const currying = (...arg) => {
  //   const args = Array.prototype.splice.call(arguments); // [].__proto__.splice.call(arg); 也行
  const args = arg;

  const innerBag = (...innerArg) => {
    // const innerArgList = [].__proto__.splice.call(arguments);

    const innerArgList = innerArg || [];

    const length = args.length;

    console.log("innerArgList", innerArgList);

    if (!innerArgList.length) return args;

    innerArgList.forEach((item) => {
      args.push(item);
    });

    console.log("args", args);

    if (length < args.length) {
      return innerBag;
    }
    return args;
  };

  return innerBag;
};

const res = currying(1, 2, 3, 4)(5, 6, 7)(8, 9);

console.log("res", res());

// 封装后的函数柯里化
function curry(fn, args) {
  var length = fn.length;
  var args = args || [];
  return function () {
    newArgs = args.concat(Array.prototype.slice.call(arguments));
    if (newArgs.length < length) {
      return curry.call(this, fn, newArgs);
    } else {
      return fn.apply(this, newArgs);
    }
  };
}

//需要被柯里化的函数
// function multiFn(a, b, c) {
//   return a * b * c;
// }

//multi是柯里化之后的函数
// var multi = curry(multiFn);
// console.log(multi(2)(3)(4));
// console.log(multi(2, 3, 4));
// console.log(multi(2)(3, 4));
// console.log(multi(2, 3)(4));
